package com.chengz.main;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethod {

    /*
 * 获取成员方法并调用：
 *
 * 1.批量的：
 *      public Method[] getMethods():获取所有”公有方法”；（包含了父类的方法也包含Object类）
 *      public Method[] getDeclaredMethods():获取所有的成员方法，包括私有的(不包括继承的)
 * 2.获取单个的：
 *      public Method getMethod(String name,Class<?>… parameterTypes):
 *                  参数：
 *                      name : 方法名；
 *                      Class … : 形参的Class类型对象
 *      public Method getDeclaredMethod(String name,Class<?>… parameterTypes)
 *
 *   调用方法：
 *      Method –> public Object invoke(Object obj,Object… args):
 *                  参数说明：
 *                  obj : 要调用方法的对象；
 *                  args:调用方式时所传递的实参；

):
 */

    public static void main(String[] args) {
        try {
            Class clazz=Class.forName("com.chengz.bo.Student");

            //所有公共方法，包括继承的公共方法
            Method[] methods =clazz.getMethods();

            for (Method me:methods){
                System.out.println(me.getName());
            }

            System.out.println("我是一个分割线-------------------------------------------");

            //获取成员的所有方法:私有的,受保护的,公共的 不包括继承的方法
            Method [] allMethods=clazz.getDeclaredMethods();

            for(Method me: allMethods){
                System.out.println(me.getName());
            }


            System.out.println("分割线---------------------------------");
            //获取对象
            Object obj=clazz.newInstance();

            //获取方法show1
            Method methodShow1=clazz.getMethod("show1",String.class);

            methodShow1.invoke(obj,"fuckyourmomgxl");


            //注意获取非公共方法时要用getDeclareMethod
            Method methodShow2=clazz.getDeclaredMethod("show2");
            //暴力调用
            methodShow2.setAccessible(true);
            methodShow2.invoke(obj);

            Method methodShow3=clazz.getDeclaredMethod("show3");
            methodShow3.setAccessible(true);
            methodShow3.invoke(obj);

            Method methodShow4=clazz.getDeclaredMethod("show4", int.class, String.class);
            methodShow4.setAccessible(true);
            Object res=methodShow4.invoke(obj,333,"fuckkkkkkkkkkkk");
            System.out.println(res);





        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }







}
